package pe.edu.upc.e41a.javasoft.dao;


import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.persistence.TypedQuery;

import pe.edu.upc.e41a.javasoft.domain.Aviso;
import pe.edu.upc.e41a.javasoft.domain.Publicacion;
import pe.edu.upc.e41a.javasoft.domain.TipoDocumento;
import pe.edu.upc.e41a.javasoft.domain.TipoPersona;
import pe.edu.upc.e41a.javasoft.domain.Transaccion;
import pe.edu.upc.e41a.javasoft.domain.Usuario;

public interface UsuarioDao {

	// Métodos persistentes
	public void saveUsuario(Usuario usuario);

	public void updateUsuario(Usuario usuario);

	public void deleteUsuario(Usuario usuario);

	// Finders comunes
	public long countUsuarios();

	public List<Usuario> findAllUsuarios();

	public Usuario findUsuario(Integer codigo);

	public List<Usuario> findUsuarioEntries(int firstResult, int maxResults);
	
	
	// Finders Avanzados
		public TypedQuery<Usuario> findUsuariosByApellidoMaternoEquals(
				String apellidoMaterno);

		public TypedQuery<Usuario> findUsuariosByApellidoMaternoIsNotNull();

		public TypedQuery<Usuario> findUsuariosByApellidoMaternoIsNull();

		public TypedQuery<Usuario> findUsuariosByApellidoMaternoLike(
				String apellidoMaterno);

		public TypedQuery<Usuario> findUsuariosByApellidoMaternoNotEquals(
				String apellidoMaterno);

		public TypedQuery<Usuario> findUsuariosByApellidoPaternoEquals(
				String apellidoPaterno);

		public TypedQuery<Usuario> findUsuariosByApellidoPaternoIsNotNull();

		public TypedQuery<Usuario> findUsuariosByApellidoPaternoIsNull();

		public TypedQuery<Usuario> findUsuariosByApellidoPaternoLike(
				String apellidoPaterno);

		public TypedQuery<Usuario> findUsuariosByApellidoPaternoNotEquals(
				String apellidoPaterno);

		public TypedQuery<Usuario> findUsuariosByAvisoes(Set<Aviso> avisoes);

		public TypedQuery<Usuario> findUsuariosByClaveEquals(String clave);

		public TypedQuery<Usuario> findUsuariosByClaveIsNotNull();

		public TypedQuery<Usuario> findUsuariosByClaveIsNull();

		public TypedQuery<Usuario> findUsuariosByClaveLike(String clave);

		public TypedQuery<Usuario> findUsuariosByClaveNotEquals(String clave);

		public TypedQuery<Usuario> findUsuariosByCorreoEquals(String correo);

		public TypedQuery<Usuario> findUsuariosByCorreoIsNotNull();

		public TypedQuery<Usuario> findUsuariosByCorreoIsNull();

		public TypedQuery<Usuario> findUsuariosByCorreoLike(String correo);

		public TypedQuery<Usuario> findUsuariosByCorreoNotEquals(String correo);

		public TypedQuery<Usuario> findUsuariosByFechaNacimientoBetween(
				Date minFechaNacimiento, Date maxFechaNacimiento);

		public TypedQuery<Usuario> findUsuariosByFechaNacimientoEquals(
				Date fechaNacimiento);

		public TypedQuery<Usuario> findUsuariosByFechaNacimientoGreaterThan(
				Date fechaNacimiento);

		public TypedQuery<Usuario> findUsuariosByFechaNacimientoGreaterThanEquals(
				Date fechaNacimiento);

		public TypedQuery<Usuario> findUsuariosByFechaNacimientoIsNotNull();

		public TypedQuery<Usuario> findUsuariosByFechaNacimientoIsNull();

		public TypedQuery<Usuario> findUsuariosByFechaNacimientoLessThan(
				Date fechaNacimiento);

		public TypedQuery<Usuario> findUsuariosByFechaNacimientoLessThanEquals(
				Date fechaNacimiento);

		public TypedQuery<Usuario> findUsuariosByFechaNacimientoNotEquals(
				Date fechaNacimiento);

		public TypedQuery<Usuario> findUsuariosByNombresEquals(String nombres);

		public TypedQuery<Usuario> findUsuariosByNombresIsNotNull();

		public TypedQuery<Usuario> findUsuariosByNombresIsNull();

		public TypedQuery<Usuario> findUsuariosByNombresLike(String nombres);

		public TypedQuery<Usuario> findUsuariosByNombresNotEquals(String nombres);

		public TypedQuery<Usuario> findUsuariosByNumeroDocumentoEquals(
				String numeroDocumento);

		public TypedQuery<Usuario> findUsuariosByNumeroDocumentoIsNotNull();

		public TypedQuery<Usuario> findUsuariosByNumeroDocumentoIsNull();

		public TypedQuery<Usuario> findUsuariosByNumeroDocumentoLike(
				String numeroDocumento);

		public TypedQuery<Usuario> findUsuariosByNumeroDocumentoNotEquals(
				String numeroDocumento);

		public TypedQuery<Usuario> findUsuariosByPublicacions(
				Set<Publicacion> publicacions);
		
		public  TypedQuery<Usuario> findUsuariosBySexo(Character sexo);

		public TypedQuery<Usuario> findUsuariosByTelefonoEquals(String telefono);

		public TypedQuery<Usuario> findUsuariosByTelefonoIsNotNull();

		public TypedQuery<Usuario> findUsuariosByTelefonoIsNull();

		public TypedQuery<Usuario> findUsuariosByTelefonoLike(String telefono);

		public TypedQuery<Usuario> findUsuariosByTelefonoNotEquals(String telefono);

		public TypedQuery<Usuario> findUsuariosByTipoDocumento(
				TipoDocumento tipoDocumento);

		public TypedQuery<Usuario> findUsuariosByTipoPersona(TipoPersona tipoPersona);

		public TypedQuery<Usuario> findUsuariosByTransaccions(
				Set<Transaccion> transaccions);

		public TypedQuery<Usuario> findUsuariosByUsuarioEquals(String usuario);

		public TypedQuery<Usuario> findUsuariosByUsuarioIsNotNull();

		public TypedQuery<Usuario> findUsuariosByUsuarioIsNull();

		public TypedQuery<Usuario> findUsuariosByUsuarioLike(String usuario);

		public TypedQuery<Usuario> findUsuariosByUsuarioNotEquals(String usuario);
}
